home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d13 / ptv2n1.arc / TYPEDEM2.CPP < prev    next >
C/C++ Source or Header  |  1991-03-26  |  6KB  |  192 lines

  1. ////////////// Demonstration of Typed Data Values //////////////////
  2. //Compile as a project with TYPEDEM2.CPP and TYPESALL.CPP.  The file 
  3. //TYPESALL.H must be in the include directory.
  4.  
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <typesall.h>
  8.  
  9. class node{ 
  10.     friend class database;
  11.     node* next; value* val;
  12.     node(){next=NULL;val=NULL;}
  13.     node(node* nxt,value* v){next=nxt;val=v;}
  14.     ~node(){delete val;}};
  15. class database{
  16.  protected:
  17.     node root;
  18.     int insert(value* val);
  19.  public:
  20.     database();
  21.     ~database();
  22.     int assert(char* namestr);
  23.     int assert(char* namestr,int val);
  24.     int assert(char* namestr,long val);
  25.     int assert(char* namestr,float val);
  26.     int assert(char* namestr,double val);
  27.     int assert(char* namestr,long double val);
  28.     int assert(char* namestr,char* val);
  29.     void retract(char* namestr);
  30.     value* valueof(char* namestr);
  31.     int count();
  32.     void show();
  33.     };
  34.  
  35. ///////Code for the database
  36. //enter values into the database
  37. database::database(){root=node();};
  38. database::~database(){
  39.     node *dad,*son=root.next;
  40.     while(son){dad=son;son=son->next;delete dad;}
  41.     }
  42.  
  43. int database::assert(char* namestr){
  44.     retract(namestr);
  45.     value* tempptr=(value*)new value(namestr);
  46.     if (!tempptr) return 0;
  47.     if (!tempptr->valid()) {delete tempptr; return 0;}
  48.     insert(tempptr); return 1;}
  49. int database::assert(char* namestr,int val){
  50.     retract(namestr);
  51.     value* tempptr=(value*)new ival(namestr,val);
  52.     if (!tempptr) return 0;
  53.     if (!tempptr->valid()) {delete tempptr; return 0;}
  54.     insert(tempptr); return 1;}
  55. int database::assert(char* namestr,long val){
  56.     retract(namestr);
  57.     value* tempptr=(value*)new lval(namestr,val);
  58.     if (!tempptr) return 0;
  59.     if (!tempptr->valid()) {delete tempptr; return 0;}
  60.     insert(tempptr); return 1;}
  61. int database::assert(char* namestr,float val){
  62.     retract(namestr);
  63.     value* tempptr=(value*)new fval(namestr,val);
  64.     if (!tempptr) return 0;
  65.     if (!tempptr->valid()) {delete tempptr; return 0;}
  66.     insert(tempptr); return 1;}
  67. int database::assert(char* namestr,double val){
  68.     retract(namestr);
  69.     value* tempptr=(value*)new dval(namestr,val);
  70.     if (!tempptr) return 0;
  71.     if (!tempptr->valid()) {delete tempptr; return 0;}
  72.     insert(tempptr); return 1;}
  73. int database::assert(char* namestr,long double val){
  74.     retract(namestr);
  75.     value* tempptr=(value*)new ldval(namestr,val);
  76.     if (!tempptr) return 0;
  77.     if (!tempptr->valid()) {delete tempptr; return 0;}
  78.     insert(tempptr); return 1;}
  79. int database::assert(char* namestr,char* val){
  80.     retract(namestr);
  81.     value* tempptr=(value*)new sval(namestr,val);
  82.     if (!tempptr) return 0;
  83.     if (!tempptr->valid()) {delete tempptr; return 0;}
  84.     insert(tempptr); return 1;}
  85.  
  86. int database::insert(value* newval){
  87.     node *n=&root;
  88.     while(n->next && strcmp(newval->name(),n->next->val->name())>0){
  89.         n=n->next;}
  90.     node* newnode=new node(n->next,newval); if(!newnode) return 0;
  91.     n->next=newnode; 
  92.     return 1;}
  93.  
  94. //remove a specific value from the database
  95. void database::retract(char* namestr){    if(!namestr) return;
  96.     node *vdead,*v=&root;
  97.     while(v->next && strcmp(namestr,v->next->val->name())){
  98.         v=v->next;}
  99.     vdead=v->next;
  100.     if(vdead){v->next=vdead->next; delete vdead;}}
  101.  
  102. //retrieve pointer to value associated with a specific nametag
  103. value* database::valueof(char* namestr){
  104.     node *v=root.next;
  105.     while(v && strcmp(namestr,v->val->name())){v=v->next;};
  106.     return v->val;}
  107.  
  108. //return count of values asserted into the database
  109. int database::count(){
  110.     int cnt=0;
  111.     for(node* v=root.next;v;v=v->next){cnt++;};
  112.     return cnt;};
  113.  
  114. //display the database
  115. void database::show(){
  116.     int N=count();
  117.     printf("Database contains %d value%s:\n",N,(N==1)? "":"s");
  118.     for(node* v=root.next;v;v=v->next){
  119.         printf("\t%s=\t%s[%s]\n",
  120.                 v->val->name(),v->val->asstring(),v->val->typename());}
  121.     printf("\n");
  122.     };
  123.  
  124. database* db;
  125. int dbchg=0;
  126. int N=12345;
  127. long L=1234567890;
  128. float F=1234.567;
  129. double D=1234567890.12345;
  130. long double LD=123456789012.345678;
  131. char S[]="Now is the time for all good programmers...";
  132. char* nullstr=NULL;
  133. void addsamples(){
  134.     db->assert("int",N);
  135.     db->assert("long",L);
  136.     db->assert("float",F);
  137.     db->assert("double",D);
  138.     db->assert("ldoubl",LD);
  139.     db->assert(nullstr,N);
  140.     db->assert("null",nullstr);
  141.     db->assert("string",S);
  142.     db->assert("username","Superman");
  143.     db->assert("weakness","Kryptonite");
  144.     dbchg=1;
  145.     printf("Sample values added.\n");}
  146.  
  147. void reportval(char* name){
  148.     value* val=db->valueof(name);
  149.     if (val){printf("%s=%s\n",name,val->asstring());}
  150.     else {printf("No value has been entered for <%s>.\n",name);}}
  151.  
  152. void deleteval(char* name){
  153.     value* val=db->valueof(name);
  154.     if (val){
  155.         db->retract(name);dbchg=1;
  156.         printf("<%s> deleted.\n",name);}
  157.     else {printf("No value has been entered for <%s>.\n",name);}}
  158.  
  159. int qmark(char* name){
  160.     int lastch=strlen(name)-1;
  161.     if(name[lastch]!='?') return 0;
  162.     name[lastch]=0; return 1;}
  163.  
  164. //The following function returns args like the command line
  165. //global values to ease conversion to argc and argv[] later
  166. char argline[80], *argptr, arg[3][80], delims[]=" \t,";
  167. int argcnt;
  168. int getargs(){
  169.     printf("Action?  "); gets(argline);    //get user input
  170.     argptr=strtok(argline,delims);    //initialize parsing function
  171.     for(argcnt=1; argcnt<3&&argptr; argcnt++) {
  172.         strcpy(arg[argcnt],argptr);
  173.         argptr=strtok(NULL,delims);}
  174.     return argcnt>1;}
  175.  
  176. void main(){
  177.     printf("Database test begins-----\n");
  178.     db=new database();
  179.  
  180.     while(getargs()){
  181.         char* name=arg[1]; char* valstr=(argcnt>2)? arg[2]:"";
  182.         if(strcmp(name,"/samples")==0)    {addsamples();}
  183.         else if(strcmp(name,"/show")==0) {db->show();}
  184.         else if(qmark(name))                    {reportval(name);}
  185.         else if(name[0]=='-')                {deleteval(name+1);}
  186.         else if(strlen(valstr)==0)            {reportval(name);}
  187.         else {db->assert(name,valstr); dbchg=1;
  188.             printf("<%s> added.\n",name);};
  189.         if(dbchg) {db->show(); dbchg=0;}
  190.         }
  191.     printf("Test complete.\n\n");}
  192.